import re
import operator

class Dicionario:
   badwords = ['_',"'"]
   dicio={}

   def __init__(self,mensagens):
      stopwords = self.importStopwords()
      print('Criando dicionario geral...')
      self.criaDicioGeral(mensagens,stopwords)

   # Adiciona todas as palavras encontradas em todas as mensagens em um unico dicionario.
   def criaDicioGeral(self,mensagens,stopwords):
      for mensagem in mensagens:
         # Adiciona palavra no dicionario (se ja esta no dicionario, incrementa o valor correspondente.
         for palavra in mensagem:
            # Se certifica de que a palavra nao faz parte das stopwords ou das badwords nem eh um digito.
            if(not( (palavra in stopwords) or (palavra in self.badwords) or palavra.isdigit()) ): # not tem precedencia a and e or
               if(self.dicio.has_key(palavra)):
                  self.dicio[palavra]+=1
               else:
                  self.dicio[palavra]=1

   # Carrega arquivo de stopwords na memoria em forma de uma lista.
   def importStopwords(self):
      arq = open('../stopwords/english') # Abre stop words (linguagem assume permissao de leitura quando segundo argumento eh omitido)
      stopwords = arq.read().lower()
      stopwords = re.findall(r"[\w']+",stopwords) # Da um split no conteudo do arquivo, removendo pontuacao.
      arq.close()
      #print(stopwords)
      return stopwords

   # Retorna uma lista ordenada contendo as n palavras mais frequentes do dicionario filtrado.
   def selecionaPalavras(self, n=0):
      dicio_n = list(sorted(self.dicio.iteritems(), key=operator.itemgetter(1))) # Ordena dicionario e joga em uma lista.
      dicio_n = dicio_n[-n:] # Filtra o dicionario para as n palavras mais frequentes.
      #print('Dicionario gerado para n=' + str(n) + ':'   )
      #print(dicio_n)
      n_palavras = []
      for x,y in dicio_n:
         n_palavras.append(x)
      #print(n_palavras)
      return(n_palavras)
